// 异常
#include <stdexcept>
#include <iostream>

/*
全用或全部用异常都不可取 应该合理分析 适度使用 降低异常成本
4个应当使用异常的判断准则：
1.不允许被忽略的错误
2.极少情况下才会发生的错误
3.严重影响正常流程，很难恢复到正常状态的错误
4.本地无法处理，必须穿透调用栈传递到上层才能被处理的错误。

异常基类是exception 其下有runtime_error等
*/



class my_exception : public std::runtime_error
{
public:
    my_exception(const char *msg) : std::runtime_error(msg)
    {
    }
};

[[noreturn]] void raise(const char *msg) // 通过定义方法来引发异常
{
    throw my_exception(msg); // C++的throw可以抛出任意对象
}

void func_with_try_catch()
{
    try
    {
        raise("exception raised!");
    }
    catch (const std::runtime_error &e) { //支持多个catch 只能按顺序匹配
        std::cerr << "catch " << e.what() << '\n';
    }
    catch (const std::exception &e)  //异常使用引用避免对象赋值成本
    {
        std::cerr << "catch " << e.what() << '\n';
    }
}


//function try 把整个函数看作一个大try catch与函数体同级 尽量在实际编码使用
void function_try()
try
{
    raise("exception raised!");
}
catch (const std::exception &e)
{
    std::cerr << "catch " << e.what() << '\n';
}

//noexcept的意思是 我保证不抛出异常，如果真发生异常 就让我死的快点儿 编译器也可以根据此编译指令对函数进行优化 不用付出栈展开的额外代码降低异常处理的成本
void func_with_no_except() noexcept
{

}

int main()
{

}